//	COPYRIGHT (C) 1980 BY BOARD OF TRUSTEES,
//	LELAND STANFORD JUNIOR UNIVERSITY

LET FINDTYPE(STR) = VALOF
 $(
 FOR I=1 TO NTYPES DO IF STREQUAL(STR,TYPENAME!I) DO RESULTIS I;
 OUTS("UNKNOWN ATOM TYPE ");OUTS(STR);NEWLINE(1);
 TOPORSTOP()
 $);

LET READPOLY(ATNUM) BE
 $( STATIC $( INNAME = NIL; RP = NIL; LP = NIL; X = NIL; PNAME = NIL;
              OSZ = NIL; LOOPING = NIL; PHMIN = NIL; PHMAX = NIL;
              PNAMEH = NIL; PHMINMIN = NIL; PHMAXMAX = NIL; STAR = NIL $);

 LET PUTATH(ATNUM) BE
  $( STATIC $( ATHPTR = NIL; PTRTOP = NIL; PHMAX2 = NIL $);
  PHMAX2:=TYPEVALENCE!ATNUM;
  IF PHMAX<PHMAX2 DO PHMAX2:=PHMAX;
  ATHPTR:=ATHSTART!ATNUM;
  PTRTOP:=ATHPTR+PHMAX2;
  ATHPTR:=ATHPTR+PHMIN-1;
  WHILE ATHPTR<PTRTOP DO $( ATHPTR+:=1; PUTELEM(ATHPTR,PNAMEH) $);
  IF PHMIN<PHMINMIN DO PHMINMIN:=PHMIN;
  IF PHMAX2>PHMAXMAX DO PHMAXMAX:=PHMAX2
  $);

 RP:=")";
 LP:="(";
 STAR:="**";
 X:="X";
 PHMINMIN:=PLUSINF;
 PHMAXMAX:=0;
 OSZ:=NSETWDSM1;
 NSETWDSM1:=NTYPES>>P2WDSZ;
 PNAME:=ZEROSET(MAKESET());
 NSETWDSM1:=NATH>>P2WDSZ;
 PNAMEH:=ZEROSET(MAKESET());
 NSETWDSM1:=OSZ;
 LOOPING:=FALSE;
 NAMELOOP:
 INNAME:=INS();
 IF STREQUAL(INNAME,RP) DO GOTO NAMEDONE;
 IF STREQUAL(INNAME,LP) DO $( LOOPING:=TRUE; GOTO NAMELOOP $);
 IF STREQUAL(INNAME,STAR) DO $( PUTELEM(0,PNAME); GOTO NAMELOOP $);
 PHMIN:=INNO();
 PHMAX:=INNO();
 TEST STREQUAL(INNAME,X) THEN
  FOR I=1 TO NTYPES DO $( PUTELEM(I,PNAME); PUTATH(I) $)
 OR
  $(
  INNAME:=FINDTYPE(INNAME);
  PUTELEM(INNAME,PNAME);
  PUTATH(INNAME)
  $);
 IF LOOPING DO GOTO NAMELOOP;
 NAMEDONE:
 HMIN!ATNUM:=PHMINMIN;
 HMAX!ATNUM:=PHMAXMAX;
 ATTYPE!ATNUM:=PNAME;
 ATTYPEH!ATNUM:=PNAMEH
 $);

LET READPATS() BE
 FOR PAT=1 TO NUMPAT DO
  $(
  OUTSIF("CTABLE FOR PATTERN "); OUTNOIF(PAT);
  OUTSIF(":*C*L");
  NPATNODES:=PATNNDS!PAT;
  FOR I=1 TO NPATNODES DO
   $( LET NDIX = PATSTOP+I;
   CTSTART!NDIX:=CTPTR;
   OUTNOIF(I); OUTCHIF(':'); OUTCHIF(' ');
   READPOLY(NDIX);
   ARTYPE!NDIX:=INNO();
   NBR:=INNO();
   UNTIL NBR=0 DO
    $(
    STACK!CTPTR:=(NBR<0 -> NBR-PATSTOP,NBR+PATSTOP);
    CTPTR+:=1;
    NBR:=INNO()
    $);
   CTSTOP!NDIX:=CTPTR-1
   $);
  OUTSIF("NUMBER OF LNODES:");NLNODES:=INNO();
  IF NLNODES>0 DO OUTSIF("LNODES, LMINS AND LMAXS:");
  FOR I=1 TO NLNODES DO
   $( LNODE:=PATSTOP+INNO(); LMINS!LNODE:=INNO(); LMAXS!LNODE:=INNO() $);
  OUTSIF("PROTON PATTERN?(Y/N):"); PTFLAG:=STREQUAL("Y",INS());
  PATSTART:=PATSTOP+1;
  PATSTOP+:=NPATNODES;
  STACKPTR:=CTPTR;
  PATRECS!PAT:=
   MAKEPATREC(PATSTART,PATSTOP,NTYPES,TYPENUM,PTFLAG);
  STACKPTR:=0;
  OUTSIF("MINIMUM NUMBER:"); PATMINS!PAT:=INNO();
  OUTSIF("MAXIMUM NUMBER:"); PATMAXS!PAT:=INNO()
  $);
